'use strict';
/**
 * @controller adminUserController 用户管理
 */
const Controller = require('egg').Controller;

class UserController extends Controller {

    /**  
     * @summary 渲染用户列表
     * @description 渲染用户列表
     * @router get /admin/user 
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async index() {
        // 结构
        let {
            ctx,
            app
        } = this
        // 查询
        let data = await ctx.page('User')
        // 渲染并返回数据
        await ctx.renderTemplate({
            data: data,
            title: '用户列表',
            tempType: 'table',
            table: {
                buttons: {
                    add: '/admin/user/create'
                },
                columns: [{
                        title: '用户',
                        fixed: 'left',
                        render(item) {
                            let avatar = item.avatar || '/public/assets/img/profiles/avatar-01.jpg'
                            return `
                        <h2 class="table-avatar">
                            <a class="avatar avatar-sm mr-2"><img class="avatar-img rounded-circle bg-light" src="${avatar}"></a>
                            <a>${item.username}</a>
                        </h2>`
                        },
                    },
                    {
                        title: '金币',
                        key: 'coin',
                        fixed: 'center'
                    },
                    {
                        title: '创建时间',
                        key: 'created_time',
                        fixed: 'center',
                        width: 200
                    },
                    {
                        title: "操作",
                        width: 200,
                        fixed: 'center',
                        action: {
                            edit: function (id) {
                                return `/admin/user/edit/${id}`
                            },
                            delete: function (id) {
                                return `/admin/user/delete/${id}`
                            },
                        }
                    }
                ]
            }
        })
    }


    /**  
     * @summary 渲染创建用户页面
     * @description 渲染创建用户页面
     * @router get /admin/user/create 
     * @request get 这里不需要参数
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async create() {
        const {
            ctx,
            app
        } = this;
        // 渲染公共模板
        await ctx.renderTemplate({
            // 页面标题
            title: "新增用户",
            // 模板类型 form表单，table表格分页
            tempType: "form",
            // 表单配置
            form: {
                // 提交地址
                action: "/admin/user/save",
                // 字段配置
                fields: [{
                        label: "用户名",
                        type: "text",
                        name: "username",
                        placeholder: "用户名",
                    }, {
                        label: "密码",
                        type: "text",
                        name: "password",
                        placeholder: "密码"
                    },
                    {
                        label: "头像",
                        type: "file",
                        name: "avatar",
                        placeholder: "头像"
                    },
                    {
                        label: "金币",
                        type: "number",
                        name: "coin",
                        placeholder: "金币"
                    }
                ]
            },
            // 新增成功跳转路径
            successUrl: "/admin/user"
        })
    }
    /**  
     * @summary 创建用户接口
     * @description 创建用户接口
     * @router post /admin/user/save 
     * * @request username string *username xxxx
     * * @request password string *password xxxx
     * * @request coin string coin xxxx
     * * @request avatar string avatar xxxx
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    // 新增逻辑
    async save() {
        // 结构
        let {
            app,
            ctx
        } = this;

        // 参数验证
        ctx.validate({
            username: {
                type: 'string',
                required: true,
                desc: '用户名'
            },
            password: {
                type: 'string',
                required: true,
                desc: '密码'
            },
            coin: {
                type: 'string',
                required: false,
                desc: '金币',
                defValue: 0,
            },
            avatar: {
                type: 'string',
                required: false,
                desc: '头像'
            }
        })
        // 获取参数
        let {
            username,
            password,
            avatar,
            coin
        } = ctx.request.body
        /* 判断用户是否存在 */
        if (await app.model.User.findOne({
                where: {
                    username: username
                }
            })) {
            return ctx.apiFail('用户已存在')
        }
        /* 创建用户 */
        let user = await app.model.User.create({
            username,
            password,
            avatar,
            coin
        })
        ctx.toast('添加成功', 'success')
        // 重定向页面
        ctx.redirect('/admin/user')
    }

    /**  
     * @summary 渲染修改用户页面
     * @description 渲染修改用户页面
     * @router get /admin/user/edit/:id 
     * * @request id string *id xxx
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async edit() {
        // 结构
        let {
            app,
            ctx
        } = this
        // 参数验证
        ctx.validate({
            id: {
                type: 'string',
                required: true,
                desc: '用户ID'
            }
        })
        // 获取参数
        let id = ctx.params.id
        // 判断管理员是否存在
        let data = await app.model.User.findOne({
            where: {
                id
            }
        })
        // 不存在-渲染404页面
        if (!data) {
            return await ctx.pageFail('该记录不存在')
        }
        // 存在-渲染表单页面
        data = JSON.parse(JSON.stringify(data))
        delete data.password
        await ctx.renderTemplate({
            id,
            title: '修改用户',
            tempType: 'form',
            form: {
                action: '/admin/user/update/' + id,
                // 字段配置
                fields: [{
                        label: "用户名",
                        type: "text",
                        name: "username",
                        placeholder: "用户名",
                    }, {
                        label: "密码",
                        type: "text",
                        name: "password",
                        placeholder: "密码"
                    },
                    {
                        label: "头像",
                        type: "text",
                        name: "avatar",
                        placeholder: "头像"
                    },
                    {
                        label: "金币",
                        type: "number",
                        name: "coin",
                        placeholder: "金币",
                        default:0
                    }
                ],
                data
            },
            // 新增成功跳转路径
            successUrl: "/admin/user"
        })
    }

    /**  
     * @summary 更新用户信息
     * @description 更新用户信息
     * @router post /admin/manager/update/:id 
     * * @request id string *id xxx
     * * @request username string *username xxx
     * * @request password string *password xxx
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async update() {
        // 结构
        let {
            app,
            ctx
        } = this
        // 参数验证
        ctx.validate({
            id: {
                type: 'int',
                required: true,
                desc: '用户ID'
            },
            username: {
                type: 'string',
                required: true,
                desc: '用户名'
            },
            password: {
                type: 'string',
                required: false,
                desc: '密码'
            },
            coin: {
                type: 'string',
                required: false,
                desc: '金币',
                defValue: 0,
            },
            avatar: {
                type: 'string',
                required: false,
                desc: '头像'
            }
        })
        // 获取参数
        let id = ctx.params.id
        let {
            username,
            password,
            coin,
            avatar
        } = ctx.request.body
        // 查询用户是否存在
        let user = await app.model.User.findOne({
            where: {
                id
            }
        })
        if (!user) {
            return ctx.apiFail('用户不存在')
        }
        // 查询用户名是否唯一 用到[Op.ne] 不等于
        let Op = app.Sequelize.Op
        if (await app.model.User.findOne({
                where: {
                    username,
                    id: {
                        [Op.ne]: id
                    }
                }
            })) {
            return ctx.apiFail('用户名已存在')
        }
        // 如果密码存在--赋值密码
        user.username = username
        user.avatar=avatar||''
        user.coin=coin
        if (password) {
            user.password = password
        }
        
        // 返回成功的提示
        ctx.apiSuccess(await user.save())
    }


     /**  
     * @summary 根据ID删除用户
     * @description 根据ID删除用户
     * * @request id string *id xxx/id
     * @router get /admin/user/delete/:id 
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async delete() {
        // 结构
        let {
            ctx,
            app
        } = this
        // 获得参数
        ctx.validate({
            id: {
                type: 'int',
                required: true,
                desc: '用户ID'
            }
        })
        // 删除数据
        let id = ctx.params.id
        // 添加cookie
        await app.model.User.destroy({
            where: {
                id
            }
        })
        ctx.toast('删除成功', 'success')
        // 重定向页面
        ctx.redirect('/admin/user')
    }
}

module.exports = UserController;